import os
import pandas as pd
from openpyxl import load_workbook
from openpyxl.styles import PatternFill
from common.utils import get_files_to_process, write_to_excel
from common.config import config


def highlight_duplicates(file_path):
    """
    标记Excel文件中的重复问题
    
    Args:
        file_path: Excel文件路径
    Returns:
        tuple: (重复问题数量, 重复问题实例总数, 文件中的问题总数)
    """
    print(f"处理文件: {file_path}")
    
    try:
        # 读取Excel文件
        df = pd.read_excel(file_path)
        
        # 获取问题总数 - 直接使用DataFrame的行数
        total_questions = len(df)
        
        # 检查是否存在"问题"列
        if '问题' not in df.columns:
            print(f"文件 {file_path} 中没有'问题'列")
            return 0, 0, total_questions
        
        # 找出重复的问题
        duplicates = df[df.duplicated('问题', keep=False)]
        if duplicates.empty:
            print(f"文件 {file_path} 中没有重复问题")
            return 0, 0, total_questions
        
        # 获取重复问题的索引和问题列表
        duplicate_indices = duplicates.index.tolist()
        duplicate_questions = duplicates['问题'].unique().tolist()
        
        # 计算重复问题实例总数
        instance_count = len(duplicate_indices)
        
        print(f"发现 {instance_count} 个重复问题实例，涉及 {len(duplicate_questions)} 个不同问题，总问题数: {total_questions}")
        
        # 使用openpyxl标记重复项
        wb = load_workbook(file_path)
        ws = wb.active
        
        # 创建填充样式（黄色背景）
        yellow_fill = PatternFill(start_color="FFFF00", end_color="FFFF00", fill_type="solid")
        
        # 找到"问题"列的索引
        header_row = 1  # 假设第一行是表头
        question_col = None
        
        # 确保ws不为None再访问其属性
        if ws is not None:
            for col in range(1, ws.max_column + 1):
                if ws.cell(header_row, col).value == '问题':
                    question_col = col
                    break
            
            if question_col is None:
                print("无法找到'问题'列")
                return 0, 0, total_questions
            
            # 标记重复项
            for idx in duplicate_indices:
                # Excel行索引从1开始，并且有表头，所以需要+2
                row = idx + 2
                ws.cell(row, question_col).fill = yellow_fill
            
            # 保存回原文件
            wb.save(file_path)
            print(f"已在原文件中标记重复问题: {file_path}")
        else:
            print(f"无法打开工作表: {file_path}")
        
        return len(duplicate_questions), instance_count, total_questions
    
    except Exception as e:
        print(f"处理文件 {file_path} 时出错: {str(e)}")
        return 0, 0, 0


def merge_files_with_same_prefix():
    """
    将test_sets目录下具有相同前缀的文件经过问题去重后整合到新的excel表中
    """
    print(f"开始整合相同前缀的文件...")
    
    # 获取所有Excel文件
    files = get_files_to_process(file_path=config.path.results_path)
    excel_files = [
        f for f in files 
        if f.endswith('.xlsx') and not os.path.basename(f) == 'duplicate_questions_report.xlsx'
    ]
    
    if not excel_files:
        print("没有找到Excel文件")
        return
    
    # 按前缀分组文件
    prefix_groups = {}
    for file_path in excel_files:
        file_name = os.path.basename(file_path)
        # 假设前缀是文件名中第一个下划线之前的部分
        prefix = file_name.split('_')[0] if '_' in file_name else file_name
        
        if prefix not in prefix_groups:
            prefix_groups[prefix] = []
        
        prefix_groups[prefix].append(file_path)
    
    # 处理每个前缀组
    for prefix, file_paths in prefix_groups.items():
        if len(file_paths) <= 1:
            print(f"前缀 '{prefix}' 只有一个文件，跳过合并")
            continue
        
        print(f"处理前缀 '{prefix}' 的 {len(file_paths)} 个文件")
        
        # 读取所有文件并合并数据
        all_data = []
        for file_path in file_paths:
            try:
                df = pd.read_excel(file_path)
                if '问题' not in df.columns:
                    print(f"文件 {file_path} 中没有'问题'列，跳过")
                    continue
                all_data.append(df)
            except Exception as e:
                print(f"读取文件 {file_path} 时出错: {str(e)}")
        
        if not all_data:
            print(f"前缀 '{prefix}' 没有有效数据，跳过合并")
            continue
        
        # 合并所有数据
        merged_df = pd.concat(all_data, ignore_index=True)
        
        # 去除重复问题，保留第一次出现的
        merged_df_no_duplicates = merged_df.drop_duplicates(subset=['问题'], keep='first')
        
        # 保存到新文件
        output_path = os.path.join(config.path.results_path, f"{prefix}_merged_no_duplicates.xlsx")
        write_to_excel(merged_df_no_duplicates, output_path)
        print(f"已将前缀 '{prefix}' 的文件合并并去重，保存到: {output_path}")
        print(f"原始问题总数: {len(merged_df)}, 去重后问题数: {len(merged_df_no_duplicates)}")


def main():
    """
    检查所有Excel文件中的重复问题并生成统计报告
    """
    print(f"测试集目录: {config.path.results_path}")
    
    # 获取所有Excel文件
    files = get_files_to_process(file_path=config.path.results_path)
    excel_files = [
        f for f in files 
        if f.endswith('.xlsx') and not os.path.basename(f) == 'duplicate_questions_report.xlsx'
    ]
    
    if not excel_files:
        print("没有找到Excel文件")
        return
    
    print(f"找到 {len(excel_files)} 个Excel文件")
    
    # 准备统计结果
    results = []
    
    # 处理每个文件
    for file_path in excel_files:
        file_name = os.path.basename(file_path)
        dup_count, instance_count, total_questions = highlight_duplicates(file_path)
        
        # 计算重复比例
        duplicate_ratio = 0
        if total_questions > 0:
            duplicate_ratio = round(instance_count / total_questions, 2)
        
        # 所有文件都记录，包括没有重复问题的
        results.append({
            '文件名': file_name,
            '重复问题对': dup_count,
            '重复问题实例数': instance_count,
            '问题总数': total_questions,
            '重复问题比例': duplicate_ratio
        })
    
    # 生成统计报告
    if results:
        # 创建DataFrame并按重复问题比例排序
        report_df = pd.DataFrame(results)
        report_df = report_df.sort_values(by='重复问题比例')
        
        report_path = os.path.join(config.path.results_path, 'duplicate_questions_report.xlsx')
        write_to_excel(report_df, report_path)
        print(f"\n统计报告已保存到: {report_path}")
    else:
        print("\n没有找到可分析的文件")
    
    # 执行新功能：合并相同前缀的文件并去重
    merge_files_with_same_prefix()


if __name__ == "__main__":
    main()